home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / cpark.zip / PARK.C < prev    next >
C/C++ Source or Header  |  1994-02-16  |  3KB  |  122 lines

  1. /*
  2.  * Parks the system hard drives.
  3.  *
  4.  * Copyright 1991 Dave Dunfield
  5.  * All rights reserved.
  6.  */
  7. #include c:\mc\stdio.h
  8.  
  9.     int parms[12] = 2;        /* Default, 2 drives park via BIOS */
  10.  
  11.     extern char PSP[];        /* To determine address of COM start */
  12.  
  13. /*
  14.  * Main program - parse arguments, park drives
  15.  */
  16. main(argc, argv)
  17.     int argc;
  18.     int *argv[];
  19. {
  20.     int drive, cyl, flag;
  21.     FILE *fp;
  22.  
  23.     flag = cyl = 0;
  24.     for(drive = 1; drive < argc; ++drive) switch(*argv[drive]) {
  25.         case '?-' :        /* Help request */
  26.         case '?'  :
  27.             abort("\nUse: park [-s cyl1 cyl2 ...]\n\nCopyright 1991 Dave Dunfield\nAll rights reserved.\n");
  28.         case 's-' :        /* Setup command */
  29.         case 'S-' :
  30.             flag = -1;
  31.             break;
  32.         default:
  33.             if(!isdigit(*(char*)argv[drive]))
  34.                 abort("Invalid operand.");
  35.             parms[parms[0] = ++cyl] = atoi(argv[drive]); }
  36.  
  37.     if(flag) {                /* Setup mode */
  38.         putc('\n', stdout);
  39.         for(drive=1; drive <= *parms; ++drive) {
  40.             printf("Park drive %u ", drive);
  41.             if(flag = parms[drive])
  42.                 printf("at cylinder %u\n", flag);
  43.             else
  44.                 printf("via BIOS\n"); }
  45.         if(cyl) {            /* Set options */
  46.             fp = fopen("PARK.COM", "bwvq");
  47.             fwrite(0x100, PSP-0x102, fp);
  48.             fclose(fp);
  49.             printf("\nPARK.COM written!\n"); }
  50.         return; }
  51.  
  52.     printf("System shutdown in progress...\n\n");
  53.  
  54.     asm {
  55.         MOV        AH,0Dh        ; Disk reset
  56.         INT        21h            ; Ask DOS
  57.     }
  58.  
  59.     for(drive = 1; drive <= *parms; ++drive) {
  60.         if(!test_disk(drive)) {
  61.             printf("Drive %u ", drive);
  62.             if(!(cyl = parms[drive]))
  63.                 cyl = max_cyl(drive);
  64.             flag = seek_disk(drive, cyl);
  65.             printf("parked at cylinder %u", cyl);
  66.             if(flag)
  67.                 printf(" - *flag %02x*", flag);
  68.             putc('\n', stdout); } }
  69.  
  70.     printf("\nTurn system power OFF now!!! ");
  71.  
  72.     while(getc(stdin) != '\n');
  73. }
  74.  
  75. /*
  76.  * Recalibrate the fixed disk (also determine its existance)
  77.  */
  78. test_disk(drive) asm
  79. {
  80.         MOV        DL,4[BP]    ; Get drive id
  81.         ADD        DL,7fh        ; Offset to drive
  82.         MOV        AH,11h        ; Recalibrate
  83.         INT        13h            ; Ask BIOS
  84.         MOV        AL,AH        ; Set low value
  85.         XOR        AH,AH        ; Zero high
  86. }
  87.  
  88. /*
  89.  * Get the maximum cylinder number for drive
  90.  */
  91. max_cyl(drive) asm
  92. {
  93.         MOV        DL,4[BP]    ; Get drive id
  94.         ADD        DL,7fh        ; Convert ID
  95.         MOV        AH,08h        ; Get parms function
  96.         INT        13h            ; Ask BIOS
  97.         MOV        AL,CH        ; Get LOW byte of result
  98.         MOV        AH,CL        ; Get HIGH two bits
  99.         MOV        CL,6        ; Shift 6 bits
  100.         SHR        AH,CL        ; Do the shift
  101. }
  102.  
  103. /*
  104.  * Seek to specified cylinder on fixed disk
  105.  */
  106. seek_disk(drive, cyl) asm
  107. {
  108.         MOV        DL,6[BP]    ; Get drive id
  109.         ADD        DL,7fh        ; Convert to BIOS id
  110.         MOV        AL,5[BP]    ; Get high cylinder
  111.         MOV        CL,6        ; Shift 6 bits
  112.         SHL        AL,CL        ; Perform shift
  113.         INC        AL            ; Sector 1
  114.         MOV        CL,AL        ; Set high bits
  115.         MOV        CH,4[BP]    ; Get LOW cylinder
  116.         XOR        DH,DH        ; Head zero
  117.         MOV        AH,0Ch        ; Function 13 SEEK
  118.         INT        13h            ; Ask BIOS
  119.         MOV        AL,AH        ; Put RC in lower byte
  120.         XOR        AH,AH        ; Zero upper byte
  121. }
  122.